FHEM – extern Daten einspeisen

Seit einiger Zeit betreibe ich einen FHEM server und protokolliere Temperatur, Luftfeuchte, Stromverbrauch und steuere Funkschalter.

Selection_064

Selection_065

Selection_066

Nun wollte ich unsere langsame Internet-Verbindung protokollieren. Dazu habe ich ein Perl Script geschrieben:

#!/usr/bin/perl
use warnings;
use strict;

use Net::Ping;
use Time::HiRes qw(tv_interval gettimeofday);
$|++;

#my($host) = shift() || die("Usage: $0 <host.somewhere.com>\n");
my ($host)="8.8.8.8";
my ($count)=0;

my($ping) = Net::Ping->new('icmp');
my($avg)=0;
my($avgcnt)=0;

while ($count<4) {
    my($timeStart) = [gettimeofday()];
    if ($ping->ping($host, 5)) {
        my($timeElapsed) = tv_interval($timeStart, [gettimeofday()]);
        #printf("%s: %.3f msec\n", $host, $timeElapsed * 1000);
        #printf("%.3f ms\n", $timeElapsed * 1000);
    $avg+=$timeElapsed * 1000;
    $avgcnt++;
    } else {
        my($timeElapsed) = tv_interval($timeStart, [gettimeofday()]);
        #printf("%s failed: %.3f\n", $host, $timeElapsed * 1000);
        #printf("%s\n", "failed");
    }
    sleep(1);
    $count++;
}

if($avgcnt!=0){
   $avg=$avg/$avgcnt;
}
else{
   $avg=0;
}
printf("%.3f\n", $avg);
system("perl", "/opt/fhem/fhem.pl", "7072", "setreading pingtime time ".$avg);
$ping->close();
exit();

Nun galt es das Script aus FHEM aufzurufen. Letztendlich scheitert dies aber daran, dass der ping Befehl root-Rechte benötigt. Die System-Zeile wurde erst später hinzugefügt. Das Script gibt einfach die mittlere Ping Zeit auf der Console (Linux Debian Jessie) aus.

Also lasse ich das Script nun von cron aus alle 5 Minuten laufen und der Perl system Befehl trägt die Daten über das fhem.pl Script direkt in den FHEM Server ein. Dazu müssen folgende Zeilen in der fhem.cfg vorhanden sein:

define pingtime dummy
attr pingtime room Internet,Dachboden
attr pingtime stateFormat time
define pingtime_log FileLog ./log/pingtime-%Y-%m.log pingtime.*
attr pingtime_log room Dachboden,Internet
define SVG_pingtime_log_1 SVG pingtime_log:SVG_pingtime_log_1:CURRENT
attr SVG_pingtime_log_1 room Internet

Diese Zeilen legen ein dummy Device namens pingtime an, weisen es den Räumen Internet und Dachbode zu; legen die Darstellung des Wertes fest und legen noch ein Log File fest, welches dem Raum Internet zugewiesen wird.

Damit das Script alle 5 Minuten gestarte wird, lege ich es crontab Eintrag fest. Dazu nutzte ich “sudo crontab -e” um die Crontab des root users zu erweitern. Folgende Zeile startet das Script dann alle 5 Minuten:

#catch ping times to google dns and update fhem
*/5 * * * * /opt/fhem/FHEM/pingtime.pl >/dev/null 2>&1

Der Aufruf als root ist wichtig, weil das Script sonst nicht funktioniert. Wie man oben sieht, wurde das Script als “pingtime.pl” im Verzeichnis /opt/fhem/FHEM gespeichert und ist mit “sudo chmod a+x pingtime.pl” als ausführbar gekennzeichnet.

Selection_067